package com.cssl.service.impl;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.cssl.dto.ProductOrderDTO;
import com.cssl.entity.ProductDetails;
import com.cssl.entity.ProductOrder;
import com.cssl.exception.BusinessException;
import com.cssl.message.IMessage;
import com.cssl.service.ProductDetailsService;
import com.cssl.service.ProductOrderService;
import com.cssl.mapper.ProductOrderMapper;
import com.cssl.util.UtilGenerateUUID;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
* @author 风止
* @description 针对表【product_order】的数据库操作Service实现
* @createDate 2025-03-13 15:03:10
*/
@Service
@Transactional
public class ProductOrderServiceImpl extends ServiceImpl<ProductOrderMapper, ProductOrder>
    implements ProductOrderService{

    @Autowired
    private IMessage message; //消息队列发送接口

    /**
     * 商品详情表
     */
    @Autowired
    private ProductDetailsService pds;


    /**
     * 新增商品订单 和 订单商品详情
     * @param poDto
     * @return
     */
    @Override
    public Map<Integer,Integer> createOrder(ProductOrderDTO poDto) throws BusinessException {
        boolean isOrderInserted = false; // 订单是否插入成功
        boolean isProductSaved = false; // 商品详情是否保存成功
        //需要扣减库存的商品信息和扣减数量
        Map<Integer,Integer> productMap = new HashMap<>();
        try {
            //需要添加的商品订单信息
            ProductOrder productOrder = new ProductOrder(
                    UtilGenerateUUID.GenerateUUID("PO"),//商品订单编号
                    poDto.getNumber(),
                    poDto.getOrder_time(),
                    0,
                    poDto.getFavorable_id(),
                    poDto.getEq_id()
            );
            // 新增商品订单
            isOrderInserted = super.baseMapper.insert(productOrder) > 0; // 检查插入是否成功

            // 新增订单商品详情
            List<ProductDetails> detailsList = new ArrayList<>(); // 需要插入的商品详情信息集合
            //遍历poDto.getListProduct() 向商品详情信息集合赋值
            poDto.getProductList().forEach((v) -> {
                //把储存商品id和数量的字符串分割出来
                String[] result = v.split("_");
                productMap.put(Integer.parseInt(result[0]),Integer.parseInt(result[1]));
                detailsList.add(new ProductDetails(
                        productOrder.getPo_id(),
                        Integer.parseInt(result[0]), //商品id
                        Integer.parseInt(result[1]) // 购买的商品数量
                ));
            });
            // 批量保存商品详情
            isProductSaved = pds.saveBatch(detailsList);

            // 如果订单或商品详情插入失败，抛出异常
            if (!isOrderInserted || !isProductSaved) {
                throw new BusinessException("订单创建失败：部分数据未插入");
            }

            //发送延时消息5分钟后判断该订单有没有付款 如何订单未付款把订单删除
            message.sendDelayedMessage(productOrder.getPo_id(),productMap);
        } catch (Exception e) {
            // 捕获异常，记录日志，并抛出业务异常
            throw new BusinessException("订单创建失败：" + e.getMessage(), e);
        }
        return productMap;
    }
}




